import Field from '@src/model/Field';
import { multiField } from './config';
import { t } from '@src/locales';
import { LogisticsFieldNameMappingEnum } from '@model/enum/FieldMappingEnum';

export type OperatorType = {
  label: string;
  value: string;
};

// 条件map
export const operatorMap: Record<string, OperatorType> = {
  like: { label: t('component.advancedSearch.conditionMap.like'), value: 'like' },
  in: { label: t('component.advancedSearch.conditionMap.in'), value: 'in' },
  cascader: { label: t('component.advancedSearch.conditionMap.cascader'), value: 'cascader' },
  user: { label: t('component.advancedSearch.conditionMap.user'), value: 'user' },
  ex: { label: t('component.advancedSearch.conditionMap.not_in'), value: 'not_in' },
  eq: { label: t('component.advancedSearch.conditionMap.eq'), value: 'eq' },
  notEq: { label: t('component.advancedSearch.conditionMap.uneq'), value: 'notEq' },
  uneq: { label: t('component.advancedSearch.conditionMap.uneq'), value: 'uneq' },
  gt: { label: t('component.advancedSearch.conditionMap.gt'), value: 'gt' },
  ge: { label: t('component.advancedSearch.conditionMap.ge'), value: 'ge' },
  lt: { label: t('component.advancedSearch.conditionMap.lt'), value: 'lt' },
  le: { label: t('component.advancedSearch.conditionMap.le'), value: 'le' },
  between: { label: t('component.advancedSearch.conditionMap.between'), value: 'between' },
  address: { label: t('component.advancedSearch.conditionMap.like'), value: 'address' },
  gt_date: { label:  t('component.advancedSearch.conditionMap.gt_date'), value: 'gt' },
  lt_date: { label:  t('component.advancedSearch.conditionMap.lt_date'), value: 'lt' },
  le_date: { label:  t('component.advancedSearch.conditionMap.le_date'), value: 'le' },
  ge_date: { label:  t('component.advancedSearch.conditionMap.ge_date'), value: 'ge' },
};

// 多选组合 包含、不包含
const multipleOperatorGroup = ['in', 'ex'];
// 下拉 单选
const singleOperatorGroup = ['eq'];
// 等于组合 等于、不等于
const eqOperatorGroup = ['eq', 'uneq'];
// 比较组
const compareOperatorGroup = ['gt', 'ge', 'lt', 'le'];

// 用户--自定义 只有等于
const commonUser = ['user'];
// 用户--系统字段 包含。不包含
const systemUser = ['in', 'ex'];

// 物流单号字段
const logisticsNoType = ['like'];

// 物流公司字段
const logisticsCompanyType = ['eq'];

// 字段对应条件列表
export const commonFieldOperatorMap: Record<string, string[]> = {
  // formType
  text: ['like', 'eq'], // 单行文本
  textarea: ['like', 'eq'], // 多行文本
  number: ['like', 'eq', ...compareOperatorGroup], // 数字
  select: multipleOperatorGroup, //
  cascader: ['cascader'], //
  user: systemUser, //
  date: ['between', 'gt_date', 'lt_date', 'le_date', 'ge_date'], //
  datetime: ['between', 'gt_date', 'lt_date', 'le_date', 'ge_date'], //
  phone: [...eqOperatorGroup, ...multipleOperatorGroup], //
  email: [...eqOperatorGroup, ...multipleOperatorGroup], //
  area: ['eq'], // 区域 -- 这里的区域就是地址下拉选择 formType === 'address'
  address: ['address'], // 自定义地址
  hasRemind: ['eq'], // 有无提醒
};

// 所有字段条件选择map
export const fieldOperatorMap: Record<string, string[]> = {
  ...commonFieldOperatorMap,
  // fieldName | formType
  // 下拉选择
  customer: ['eq', 'notEq'], // commonFieldOperatorMap.select, // 客户
  parentCustomer: ['in', 'ex'], // 上级客户
  product: ['eq'], // 产品
  tlmName: ['eq'], // 联系人 - 工单
  linkman: ['eq'], // 联系人 - 客户管理
  tags: commonFieldOperatorMap.select, // 部门
  level: commonFieldOperatorMap.select, // 优先级
  serviceType: commonFieldOperatorMap.select, // 服务类型
  serviceContent: commonFieldOperatorMap.select, // 服务内容
  // 日期
  planStartTime: commonFieldOperatorMap.date, // 计划开始时间
  planEndTime: commonFieldOperatorMap.date, // 计划结束时间
  planTime: commonFieldOperatorMap.date, // 计划时间
  // 文本
  cusAddress: ['like', 'eq'], // 详细地址
  addressDetail: ['like', 'eq'], // 详细地址 -- 客户管理
  description: commonFieldOperatorMap.text, // 描述
  textarea: commonFieldOperatorMap.text, // 多行文本 ---> 单行文本
  phone: commonFieldOperatorMap.text, // 手机号
  email: commonFieldOperatorMap.text, // 邮箱
  code: commonFieldOperatorMap.text,
  // 数字
  // formula: commonFieldOperatorMap.number, // 计算公式 ---> number
  formula: ['eq'], // 计算公式 ---> number

  serviceProviderQualification: ['eq'], // 服务商资质
  engineerQualification: ['eq'], // 工程师资质

  location: ['eq'], // 位置
  related_task: ['eq'], // 关联工单
  related_customer: ['eq'], // 关联客户
  related_customers: ['eq'], // 关联客户---客户管理内为什么不一样？？？
  relationCustomer: commonFieldOperatorMap.text, // 关联客户
  relationProduct: commonFieldOperatorMap.text, // 关联产品
  catalogId: ['eq', 'notEq'], // 产品类型
  productMenu: ['in'], // 产品目录
  productType: ['eq'], // 故障库 产品类型
  authorizeProduct: ['in', 'ex'], // 服务商-授权产品目录
  tagLabel: ['eq'], // 服务商-标签
  authorizeAddress: ['eq'], // 服务商-授权区域
  // 产品服务商
  serviceProviders: ['eq'],
  // 关联表单
  relationForm: ['like'],
  // 里程
  taskEstimatedMileage:['gt','ge','lt','le','between'],
  estimatedMileage:['gt','ge','lt','le','between'],
  actualMileage:['gt','ge','lt','le','between'],
  svcProjectName: systemUser,
  productCustomerMultiAddress: ['in', 'ex'],
  productCompleteAddress: ['like'],
  currency: ['eq', ...compareOperatorGroup, 'between'], // 数字
  contractNo: ['eq'], // 合同编号
  contractName: ['eq'], // 合同名称
};

// 多选操作符
const multipleValue = [
  operatorMap.in.value, // 包含
  operatorMap.ex.value, // 不包含
  operatorMap.user.value, // 人员控件
];
// 是否多选
export function isMultiValue(operator: string) {
  return multipleValue.includes(operator);
}

/**
 * 获取field对应条件列表
 * @param {Field} field
 * @returns {Array<OperatorType>} OperatorTypes
 */
export function getFieldOperator(field: Field, module: String, conditionModule: String) {
  const { fieldName, formType, isSystem, setting } = field;
  let operators = fieldOperatorMap[fieldName] ?? fieldOperatorMap[field.formType] ?? [];
  if (formType === 'user') {
    // common--自定义的人员控件，也是多选
    operators = isSystem ? systemUser : commonUser;
  }

  // 物流组件高级搜索传参解析
  if (formType === 'logistics') {
    if (fieldName.indexOf(LogisticsFieldNameMappingEnum.LogisticsNo) > -1) {
      operators = logisticsNoType;
    }

    if (fieldName.indexOf(LogisticsFieldNameMappingEnum.LogisticsCompany) > -1) {
      operators = logisticsCompanyType;
    }
  }

  if (formType === 'select') {
    // 下拉菜单 多选和自定义字段可以多选（包含、不包含）
    operators = multiField.includes(fieldName) || setting?.isMulti || !isSystem ? multipleOperatorGroup : singleOperatorGroup;
  }

  // 新建智能计划时，客户、产品增加包含条件
  if (module == 'createSmartPlan') {
    const isCustomerField = fieldName == 'customer' || formType == 'customer'
    const isProductField = fieldName == 'product' || formType == 'product'
    if ((isCustomerField || isProductField) && !operators.includes('in')) {
      operators = ['in'].concat(operators)
    }
    // 单个条件选择模块为合同时，日期时间为介于，其它字段都为包含
    if (conditionModule == 'contract') {
      if (formType == 'date' || formType == 'datetime') {
        operators = ['between']
      } else if (formType == 'user') {
        operators = ['in']
      } else {
        operators = ['like']
      }
    }
  }

  return operators.map(op => operatorMap[op]);
}
